package com.sun.api;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/api")
public class RedisTemplateString {

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/string")
    public String str(){
        // 插入一个key值
        redisTemplate.opsForValue().set("a", 1000);
        // 判断是否有key对应的值，有返回true，没有返回false
        boolean isExist = redisTemplate.hasKey("a");
        System.out.println(isExist);
        // 取出key对应的值
        redisTemplate.opsForValue().get("a");
        // 删除某个key
        redisTemplate.delete("a");
        // 批量删除key
        List keys = new ArrayList<String>();
        keys.add("a");
        keys.add("b");
        redisTemplate.delete(keys);
        // 将当前传入的key值序列化为btye[]类型
        redisTemplate.opsForValue().set("b", 2000);
        System.out.println(redisTemplate.dump("b"));
        // 设置过期时间
        redisTemplate.expire("b", 10000, TimeUnit.MILLISECONDS);
//        System.out.println(redisTemplate.expireAt("b", new Date()));

        // 查找匹配的key值，返回set集合
        redisTemplate.opsForValue().set("a", 1100);
        redisTemplate.opsForValue().set("c", 3000);
        System.out.println(redisTemplate.keys("*"));

        // 修改key名称
        redisTemplate.rename("a", "aa");

        // 返回传入key存储的数据类型
        System.out.println(redisTemplate.type("aa"));

        // 随机取出一个key
        System.out.println(redisTemplate.randomKey());

        // 返回当前key剩余过期时间
        System.out.println(redisTemplate.getExpire("aa"));
        System.out.println(redisTemplate.getExpire("aa", TimeUnit.SECONDS));

        // 将key持久化
        redisTemplate.persist("c");

        // 将当前key迁移到指定数据库中
        redisTemplate.move("c", 1);

        // 返回部分字符
        System.out.println(redisTemplate.opsForValue().get("a", 0, 2));

        // 批量获取值
        List keys2 = new ArrayList();
        keys2.add("a");
        keys2.add("b");
        keys2.add("c");
        System.out.println(redisTemplate.opsForValue().multiGet(keys2));

        // 新增字符串
        redisTemplate.opsForValue().append("a", "1000");

        // 如果对应的map集合名称不存在，则添加否则不做修改
        Map valueMap = new HashMap();
        valueMap.put("valueMap1", "map1");
        valueMap.put("valueMap2", "map2");
        valueMap.put("valueMap3", "map3");
        redisTemplate.opsForValue().multiSetIfAbsent(valueMap);

        // 设置map集合到redis
        Map valueMap2 = new HashMap();
        valueMap2.put("valueMap1", "map1");
        valueMap2.put("valueMap2", "map2");
        valueMap2.put("valueMap3", "map3");
        redisTemplate.opsForValue().multiSet(valueMap2);

        // 获取字符串的长度
        redisTemplate.opsForValue().size("a");

        // 重新设置key对应的值，如果存在返回false，否则返回true
        redisTemplate.opsForValue().setIfAbsent("a", 33);

        // 将值 value 关联到 key,并将 key 的过期时间设为 timeout
        redisTemplate.opsForValue().set("a", 2000, 10, TimeUnit.HOURS);

        // 将二进制第offset位值变为value
//        redisTemplate.opsForValue().setBit(key, offset, value);

        // 对key所储存的字符串值，获取指定偏移量上的位(bit)
//        redisTemplate.opsForValue().getBit(key, offset);
        return "OK";
    }
}
